package DynamicProgrammingPackage;

public class combinationSum4_ {
    public static void main(String[] args) {

        System.out.println(combinationSum4(new int[]{1, 2, 3}, 4));
    }

    // 物品为nums, 背包容量为target
    // 1. dp[i]表示: 装满容量为i的背包共有dp[i]种方案
    // 2. 递推公式: dp[j] = dp[j] + dp[j - nums[i]]
    // 3. 初始化: dp[0] = 1;
    // 4. 遍历顺序: 完全背包

    // 此题是求出排列{1,2}和{2,1}算两种
    // 如果求组合 则先遍历物品后遍历背包
    // 如果求排列 则先遍历背包后遍历物品
    public static int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target + 1];
        dp[0] = 1;
        for (int j = 1 ; j <= target ; j++) {
            for (int i = 0 ; i < nums.length ; i++) {
                if (j - nums[i] >= 0) {
                    dp[j] += dp[j - nums[i]];
                }
            }
        }
        return dp[target];
    }
}
